package fr.upmc.aladyn.manualreflect;

import static org.junit.Assert.*;

import java.lang.reflect.Method;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import fr.upmc.aladyn.annotation.Transactionable;
import fr.upmc.aladyn.manualreflect.MyApp;
import fr.upmc.aladyn.manualreflect.ObjetTrans;
import fr.upmc.aladyn.shared.ObjetNonTrans;

public class MyAppTest {
	
	protected MyApp classeExemple1;
	protected Class<?> c;

	@Before
	public void setUp() throws Exception {
		classeExemple1 = new MyApp();
		c = classeExemple1.getClass();
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testClasseExemple1() {
		MyApp ce1 = new MyApp();
		assertEquals(0, ce1.getUnInt());
		assertTrue(ce1.getClass().isAnnotationPresent(Transactionable.class));
	}

	@Test
	public void testM2() throws NoSuchMethodException, SecurityException {
		Method m2 = c.getDeclaredMethod("m2", new Class[]{int.class});
		assertFalse(m2.isAnnotationPresent(Transactionable.class));
		
		try {
			classeExemple1.m2(10);
			assertFalse(true);
		} catch (Exception e) {
			assertTrue(true);
		}
	}

	@Test
	public void testM1() throws NoSuchMethodException, SecurityException {
		Method m1 = c.getDeclaredMethod("m1");
		assertFalse(m1.isAnnotationPresent(Transactionable.class));
		
		assertEquals(0, classeExemple1.getUnInt());
		classeExemple1.m1();
		assertEquals(10, classeExemple1.getUnInt());
	}

	@Test
	public void testM1_transactionnee() throws Exception {
		Method m1_transactionnee = c.getDeclaredMethod("m1_transactionnee");
		assertTrue(m1_transactionnee.isAnnotationPresent(Transactionable.class));
		
		assertEquals(0, classeExemple1.getUnInt());
		assertEquals("uneChaine", classeExemple1.getUneChaine());
		
		ObjetTrans oTrans = classeExemple1.getObjetTrans();
		assertTrue(oTrans.getClass().isAnnotationPresent(Transactionable.class));
		assertEquals("transactionnable", oTrans.getName());
		assertEquals(1, oTrans.getValue());
		
		ObjetNonTrans oNonTrans = classeExemple1.getObjetNonTrans();
		assertFalse(oNonTrans.getClass().isAnnotationPresent(Transactionable.class));
		assertEquals("nonTransactionnable", oNonTrans.getName());
		assertEquals(2, oNonTrans.getValue());
		
		classeExemple1.m1_transactionnee();
		
		assertEquals(0, classeExemple1.getUnInt());
		assertEquals("uneChaine", classeExemple1.getUneChaine());
		
		assertTrue(oTrans == classeExemple1.getObjetTrans());
		assertEquals("transactionnable", classeExemple1.getObjetTrans().getName());
		assertEquals(1, classeExemple1.getObjetTrans().getValue());
		
		assertTrue(oNonTrans == classeExemple1.getObjetNonTrans());
		assertEquals("nonTransactionnable**", classeExemple1.getObjetNonTrans().getName());
		assertEquals(22, classeExemple1.getObjetNonTrans().getValue());
	}

}
